% Fonction pour tracer 3 courbes (vue 3D, coupe selon x, coupe selon y)
%
% les parametres de la fonction sont les noms des fichiers solution exacte et
% solution calculee

function trace = f(fic_sol_exacte, fic_sol_calculee)

%  lecture du fichier fic_sol_exacte
%
%  nx : taille en x (impair)
%  ny : taille en y (impair)
%  solex : matrice (nx,ny) qui contient la solution exacte

  fuv            = fopen (fic_sol_exacte, 'r');
  nx             = fscanf(fuv, '%f %f', [1,1]);
  ny             = fscanf(fuv, '%f %f', [1,1]);
  solex          = fscanf(fuv, '%f %f', [nx,ny]);
                   fclose(fuv);

%  lecture du fichier fic_sol_calculee
%
%  nx : taille en x (impair)
%  ny : taille en y (impair)
% solcalc : matrice (nx,ny) qui contient la solution calculee

  fuv            = fopen (fic_sol_calculee, 'r');
  nx             = fscanf(fuv, '%f %f', [1,1]);
  ny             = fscanf(fuv, '%f %f', [1,1]);
  solcalc        = fscanf(fuv, '%f %f', [nx,ny]);
                   fclose(fuv);

% on calcule le min et le max de la solution exacte et de la solution approchee
% pour pouvoir positionner l'axe z pour les vues 3D

  valmax = max( max(max(solex)), max(max(solcalc)));
  valmin = min( min(min(solex)), min(min(solcalc)));

  one = 1.0 ;
  hx = one/(nx+1) ;
  hy = one/(ny+1) ;

% abscisses et ordonnees des points de dicretisation

  x  = 1 : nx ;
  y  = 1 : ny ;

  x = x* hx ;
  y = y* hy ;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%      Les Vues 3D
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Sur une meme figure, on a la vue 3D de la solution exacte,
%                           la vue 3D de la solution approchee,
%                           la vue 3D de l'erreur absolue,
%                           la vue 3D de l'erreur relative

% Vue en 3D de la solution exacte

  figure;

% la figure est composee de quatre sous-figures placee sous forme de damier 2x2
% la vue 3D de la solution exacte est la premiere

  subplot(2,2,1);

% on trace la courbe de la solution exacte

  mesh(x,y,solex') ;

% on positionne les valeurs min et max de l'axe z
% pour que les deux courbes soient representee avec le meme axe z
% afin de pouvoir comparer

  axis([0 1  0 1 valmin valmax]);

% titre de la sous-figure et labels des axes

  title([ ' SOLUTION EXACTE ' int2str(nx) ' x ' int2str(ny) ]);
  xlabel('x');
  ylabel('y');

% Vue en 3D de la solution calculee

  subplot(2,2,2);
  mesh(x,y,solcalc') ; 
  axis([0 1  0 1 valmin valmax]);
  title([ ' SOLUTION CALCULEE ' int2str(nx) ' x ' int2str(ny)]);
  xlabel('x');
  ylabel('y');

% Vue 3D de l'erreur absolue

  subplot(2,2,3);
  erreur_abs = abs(solex  - solcalc) ;
  mesh(x,y,erreur_abs') ;
  title([ ' ERREUR ABSOLUE ' int2str(nx) ' x ' int2str(ny)]) ;
  xlabel('x');
  ylabel('y');

% Vue 3D de l'erreur relative : Attention solex(i,j) <> 0

  subplot(2,2,4);
  for j = 1:ny,
    for i = 1:nx,
      erreur_rel(i,j) = erreur_abs(i,j) / solex(i,j);
    end;
  end;
  mesh(x,y,erreur_rel') ;
  title([ ' ERREUR RELATIVE ' int2str(nx) ' x ' int2str(ny)]) ;
  xlabel('x');
  ylabel('y');

% sortie sous forme de fichier postscript encapsule
% utile pour inclure la figure dans un fichier LateX

  filename = [ 'Vue_3D_' int2str(nx) ];
  eval(['print ' filename ' -deps' ]);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Courbes des coupes a x = 0.5 et y = 0.5
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


% sur la meme figure solution exacte, approchee et erreur relative
% pour le plan de coupe x = 0.5

  figure;

% nx est impair ; le milieu est en (nx+1)/2

  coupe_x = solex(fix((nx+1)/2),:) ;

% courbe de la solution exacte en cyan ('c-')

  plot(y,coupe_x,'c-') ;
  hold on;

% courbe de la solution approchee en rouge ('r--')

  coupe_x = solcalc(fix((nx+1)/2),:) ;
  plot(y,coupe_x,'r--') ;
  hold on;

% courbe de l'erreur relative en noir ('k')

  erreur_x = erreur_rel(fix((nx+1)/2),:) ;
  plot(y,erreur_x,'k:');

% titre, labels des axes, legende (dans l'ordre de trace des courbes)

  title([int2str(nx) ' x ' int2str(ny) ' - Coupe a x = 0.5' ]) ;
  xlabel('y') ;
  ylabel('f(0.5,y)') ;
  legend('Solution exacte','Solution approchee','Erreur Relative',0)
